// 原生call
// foo.call("123", 10, 20, 30)
// 封装call方法
Function.prototype.yzcall = function(thisArg, ...args) {
  // console.log("this")
  // console.log(this)
  // 在这里执行调用函数
  // 问题：要获取到哪是哪一个函数执行了yzcall
  // this就是指向使用该yzcall的函数
  var fn = this
  // 1.转化this，防止数字、字符串类型报错
  thisArg = (thisArg !== null && thisArg !== undefined) ? Object(thisArg) : window

  // 2.调用需要执行的函数
  thisArg.fn = fn
  // 3.获取到最后的结果
  var result = thisArg.fn(...args)
  delete thisArg.fn
  return result
}

function foo(params) {
  console.log("foo", this)
  console.log(params)
}
function foo1()  {
  console.log("foo1", this)
}
function sum(num1, num2) {
  console.log(num1 + num2)
  return num1 + num2
}

// 默认隐式绑定
foo.yzcall("abc", 123)
// foo1.yzcall({name: "yz"})
// foo.yzcall(null)
// sum.yzcall("aa", 10, 20)

